//创建用户相关的小仓库
import { defineStore } from "pinia";
import { reqLogin,reqUserInfo,reqLogout} from '@/api/user/index.ts';
import type { loginFormData, loginResponseData } from '@/api/user/type.ts'
import type { user_State } from "./types/type";
import {SET_TOKEN,GET_TOKEN} from '@/utils/token'
import {constantRoute,asyncRoute,anyRoute} from '@/router/routes.ts'
import router from '@/router'
import { cloneDeep } from "lodash";

//用于过滤登录用户能访问的路由
function filterRoute(asyncRoute:any,route:any){;
    return asyncRoute.filter((item:any)=>{
        if(route.includes(item.name)){
            if(item.children&&item.children.length>0){
                item.children=filterRoute(item.children,route)
                
            }
            return true
        }
    })
}
// 保存初始路由（用于重置）
const initialRoutes = router.getRoutes();

// 重置路由为初始状态
export function resetRouter() {
  // 移除所有动态添加的路由
  router.getRoutes().forEach(route => {
    const name = route.name;
    if (name && !initialRoutes.some(r => r.name === name)) {
      router.removeRoute(name);
    }
  });
}


//储存数据
const useUserStore = defineStore('user', {
    //储存用户数据
    state: (): user_State => {
        return {
            token: GET_TOKEN(),
            menuRoutes:constantRoute,
            username:'',
            avatar:'',
            buttons:[]
        }
    },
    //异步|逻辑,处理异步任务
    actions: {
        //用户登录的方法
        // async Login_request(data: loginFormData) {
        //     let result: loginResponseData = await reqLogin(data)

        //     //登录成功200
        //     if (result.code == 200) {
        //         //存储请求结果中的token
        //         this.token = (result.data.token as string)
        //         //持久化存储
        //         SET_TOKEN(this.token)
        //         // localStorage.setItem('token',this.token)
        //         //保证返回一个成功的promise
        //         return 'ok'
        //     } else {

        //         //登录失败，返回一个失败的promise,使用Promise.reject返回一个包含错误信息的Promise对象
        //         return Promise.reject(new Error(result.data.message))
        //     }

        // },
        async Login_request(data: loginFormData) {
            //登录请求
            const result: loginResponseData = await reqLogin(data)
            resetRouter()
            //登录成功200
            if (result.code == 200) {
                //存储请求结果中的token
                this.token = result.data
                //持久化存储
                SET_TOKEN(result.data)
                // localStorage.setItem('token',this.token)
                //保证返回一个成功的promise
                return 'ok'
            } else {
                //登录失败，返回一个失败的promise,使用Promise.reject返回一个包含错误信息的Promise对象
                return Promise.reject(new Error(result.data))
            }

        },
        //获取用户信息
        async userInfo() {
            //获取用户信息，用于存储用户信息[用户头像、名字]到仓库中
            const result:any=await reqUserInfo()
            

            //存入仓库
            if(result.code==200){
                this.username=result.data.username
                this.avatar=result.data.avatar 
                this.buttons=result.data.btnInfo
                
                //带用方法设置路由访问的权限
                const userasyncRoute=filterRoute(cloneDeep(asyncRoute),result.data.routeInfo)
                //菜单需要的数组整理完毕，目前只注册了常量路由
                this.menuRoutes=[...constantRoute,...userasyncRoute,...anyRoute];

                // 动态追加异步路由和任意路由
                [...userasyncRoute,...anyRoute].forEach(item=>{
                    router.addRoute(item)
                })
                
                
                
                return 'ok'
            }else{
                return Promise.reject("未能获取用户信息")
            }
            
        },
        //退出登录
        async userLogOut(){
            //退出登录（告诉服务器唯一标识失败），先清空本地存储
            let result :any=await reqLogout()
            resetRouter()
            
            if(result.code===200){
                this.token=''
                this.username=''
                this.avatar=''
                localStorage.removeItem('token')
                return 'ok'
            }   
            else{
                return Promise.reject(result.message)
            }
        },

    },
    //计算属性
    getters: {

    }

})
export default useUserStore